#pragma once

#include <string>
#ifdef _WIN32
#include <windows.h>
using namespace std;

// Converting a WChar string to a Ansi string
std::string WChar2Ansi(LPCWSTR pwszSrc)
{
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
    if (nLen <= 0)
        return std::string("");
    char* pszDst = new char[nLen];
    if (NULL == pszDst)
        return std::string("");
    WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
    pszDst[nLen - 1] = 0;
    std::string strTemp(pszDst);
    delete[] pszDst;
    return strTemp;
}
string ws2s(wstring& inputws)
{
    return WChar2Ansi(inputws.c_str());
}

// Converting a Ansi string to WChar string
std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
{
    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
    if (nSize <= 0)
        return NULL;
    WCHAR* pwszDst = new WCHAR[nSize + 1];
    if (NULL == pwszDst)
        return NULL;
    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, pwszDst, nSize);
    pwszDst[nSize] = 0;
    if (pwszDst[0] == 0xFEFF) // skip Oxfeff
        for (int i = 0; i < nSize; i++)
            pwszDst[i] = pwszDst[i + 1];
    wstring wcharString(pwszDst);
    delete pwszDst;
    return wcharString;
}
std::wstring s2ws(const string& s)
{
    return Ansi2WChar(s.c_str(), s.size());
}

int main()
{
    wstring ws = s2ws("E:/DevProject/NodejsProject");
    wstring wsa = L"test wstring";
    printf("%s-%ls\n", "result", wsa.c_str());
    printf("%s-%ls\n", "result", ws.c_str());
}

#endif